#include <iostream>

void func(void*)
{
    std::cout << "func(void*)" << std::endl;
}

void func(int)
{
    std::cout << "func(int)" << std::endl;
}

void func(long long)
{
    std::cout << "func(long long)" << std::endl;
}

void funcptr(void*) 
{
    std::cout << "funcptr(void*)" << std::endl;
}

template<typename FuncType, typename Pointer>
void FuncTypePointer(FuncType func, Pointer pointer)
{
    func(pointer);
}

int main() {
    void* p0 = 0;
    void* pNULL = NULL;
    void* pnullptr = nullptr;

    auto a0 = 0;
    auto aNULL = NULL;
    auto anullptr = nullptr;

    func(0);
    func(NULL);
    func(nullptr);

    //FuncTypePointer(funcptr, 0);
    //FuncTypePointer(funcptr, NULL);
    FuncTypePointer(funcptr, nullptr);

    return 0;
}